A virtual machine (e.g., Java® Virtual Machine) is typically software that acts as an interface between an application (e.g., Java® applications) and a microprocessor or hardware platform that actually performs the instructions of the application. In other words, the virtual machine runs the applications. To do so, virtual machines typically specify an instruction set, a set of registers, a stack, a heap, and a method area. Note that a heap is an area of memory that an application uses to store an amount of data (e.g., objects) that is unknown until application run-time.
A detailed description of virtual machines and applications is provided by Tim Lindholm and Frank Yellin in “The Java™ Virtual Machine Specification” (2nd Edition, Addison-Wesley Publishing Company) (Apr. 14, 1999), which is incorporated herein by reference. Additional information regarding virtual machines and applications can be found on the Internet at http://developer.java.sun.com. The information found at this web site is also incorporated herein by reference.
There are two main approaches to simultaneously running multiple applications by a virtual machine. In a first approach, each application is run by a separate virtual machine. In a second approach, one virtual machine runs a plurality of applications. The first approach is current practice, but virtual machines typically require a significant amount time to initialize and consume a significant amount of memory to operate. Accordingly, running multiple applications under a single virtual machine is advantageous. This approach is particularly efficient for multiple, small applications (e.g., Java@servlet) because virtual machines have fixed costs (e.g., memory and initialization time) that are not proportional to the size of applications running therein.
But using current techniques for running multiple applications under a single virtual machine leads to insufficient resource (e.g., memory) isolation between applications. This lack of isolation enables a single application to consume a disproportionate share of resources to the detriment of the other applications. To improve resource isolation among applications, a virtual machine must measure resource usage and associate the measured resource usage with a specific application.
One method for determining the resource usage of an application is to do a garbage-collection style traversal from the root set of each application. This method does, however, require processing time proportional to the number of applications traversed.
Another method is to keep track of resources (e.g., objects) allocated and deallocated by an application. The method works so long as applications are completely isolated from each other. If, however, applications can share objects, this method is inaccurate because objects that were allocated by one application may be kept alive by another application. Additionally, this method is undesirable because it requires explicit work when freeing garbage (e.g., unused allocated resources or objects) and imposes memory overhead to track the resources.
There is needed in the art therefore a system and method for measuring resource usage of each of a plurality of applications running under a single virtual machine that requires at most two passes across application objects and accounts for object sharing amongst applications.